package com.wl.designpattern.composite;

/**
 * 组合模式
 * 将对象组合成树形结构以表示“部分-整体”的层次结构，使得用户对单个对象和组合对象的使用具有一致性。
 *
 * Component（抽象组件角色）：定义参加组合对象的共有方法和属性，可以定义一些默认的函数或属性。
 * Leaf（叶子节点）：叶子没有子节点，因此是组合树的最小构建单元。
 * Composite（树枝节点）：定义所有枝干节点的行为，存储子节点，实现相关操作。
 *
 * 应用场景
 * 表示对象的部分-整体层次结构时。
 * 从一个整体中能够独立出部分模块或功能时。
 *
 * 优点
 * 高层模块（客户端）调用简单。局部和整体都是同样的结构，客户端无需关心是局部还是整体。
 * 新增节点容易。无需对现有类库进行任何修改，符合开闭原则。
 *
 * 缺点
 * 不同的组合模式实现有不同的缺点，具体看上面的分析。
 *
 * android 应用
 * View与ViewGroup就是典型的此模式
 *
 * Created by wangliang on 2021/2/27.
 */
public class Test {
    public static void main(String[] args) {
        PageElement root = new Column("网站页面");
        //网站页面添加两个栏目：音乐,视屏;以及一个广告内容。
        PageElement music = new Column("音乐");
        PageElement video = new Column("视屏");
        PageElement ad = new Content("广告");
        root.addPageElement(music);
        root.addPageElement(video);
        root.addPageElement(ad);

        //音乐栏目添加两个子栏目：国语,粤语
        PageElement chineseMusic = new Column("国语");
        PageElement cantoneseMusic = new Column("粤语");
        music.addPageElement(chineseMusic);
        music.addPageElement(cantoneseMusic);

        //国语,粤语栏目添加具体内容
        chineseMusic.addPageElement(new Content("十年.mp3"));
        cantoneseMusic.addPageElement(new Content("明年今日.mp3"));

        //视频栏目添加具体内容
        video.addPageElement(new Content("唐伯虎点秋香.avi"));

        //打印整个页面的内容
        root.print("");

        testAQ();
    }

    private static void testAQ() {
        AQColumn root = new AQColumn("网站页面");

        AQColumn music = new AQColumn("音乐");
        AQColumn video = new AQColumn("视屏");
        AQPageElement ad = new AQContent("广告");
        root.addPageElement(music);
        root.addPageElement(video);
        root.addPageElement(ad);

        AQColumn chineseMusic = new AQColumn("国语");
        AQColumn cantoneseMusic = new AQColumn("粤语");
        music.addPageElement(chineseMusic);
        music.addPageElement(cantoneseMusic);

        chineseMusic.addPageElement(new AQContent("十年.mp3"));
        cantoneseMusic.addPageElement(new AQContent("明年今日.mp3"));

        video.addPageElement(new AQContent("唐伯虎点秋香.avi"));

        root.print("");
    }
}
